// HTTP 状态码参考工具
class HttpStatusTool {
    static statusCodes = {
        // 1xx 信息响应
        100: { message: 'Continue', description: '继续。服务器已接收到请求的第一部分，正在等待其余部分。' },
        101: { message: 'Switching Protocols', description: '切换协议。服务器正在切换协议。' },
        102: { message: 'Processing', description: '处理中。服务器已收到请求并正在处理，但还没有响应可用。' },
        103: { message: 'Early Hints', description: '早期提示。主要用于与Link头部一起使用，以允许用户代理在服务器准备响应时开始预加载资源。' },

        // 2xx 成功响应
        200: { message: 'OK', description: '请求成功。成功的意思根据HTTP方法的不同而不同。' },
        201: { message: 'Created', description: '已创建。请求成功并且服务器创建了新的资源。' },
        202: { message: 'Accepted', description: '已接受。服务器已接受请求，但尚未处理。' },
        203: { message: 'Non-Authoritative Information', description: '非权威信息。服务器已成功处理了请求，但返回的信息可能来自另一来源。' },
        204: { message: 'No Content', description: '无内容。服务器成功处理了请求，但没有返回任何内容。' },
        205: { message: 'Reset Content', description: '重置内容。服务器成功处理了请求，但没有返回任何内容，并要求请求者重置文档视图。' },
        206: { message: 'Partial Content', description: '部分内容。服务器成功处理了部分GET请求。' },
        207: { message: 'Multi-Status', description: '多状态。WebDAV请求可能包含多个子请求，每个都涉及资源操作。' },
        208: { message: 'Already Reported', description: '已报告。DAV绑定的成员已经在此请求的早期部分被列举，并且不会再次包含。' },
        226: { message: 'IM Used', description: '使用IM。服务器已经满足了对资源的请求，对应当前实例应用的一个或多个实例操作的结果。' },

        // 3xx 重定向
        300: { message: 'Multiple Choices', description: '多种选择。被请求的资源有一系列可供选择的回馈信息。' },
        301: { message: 'Moved Permanently', description: '永久移动。请求的资源已永久移动到新位置。' },
        302: { message: 'Found', description: '找到。请求的资源现在临时从不同的 URI 响应请求。' },
        303: { message: 'See Other', description: '查看其它地址。对应当前请求的响应可以在另一个 URI 上被找到，而且客户端应当采用 GET 的方式访问那个资源。' },
        304: { message: 'Not Modified', description: '未修改。自从上次请求后，请求的网页未修改过。' },
        305: { message: 'Use Proxy', description: '使用代理。被请求的资源必须通过指定的代理才能被访问。' },
        307: { message: 'Temporary Redirect', description: '临时重定向。请求的资源现在临时从不同的URI 响应请求。' },
        308: { message: 'Permanent Redirect', description: '永久重定向。请求和所有将来的请求应该使用另一个URI重复。' },

        // 4xx 客户端错误
        400: { message: 'Bad Request', description: '错误请求。服务器无法理解请求的格式，客户端不应当尝试再次使用相同的内容发起请求。' },
        401: { message: 'Unauthorized', description: '未授权。请求要求身份验证。对于需要登录的网页，服务器可能返回此响应。' },
        402: { message: 'Payment Required', description: '需要付款。此响应码保留以便将来使用，创造此响应码的最初目的是用于数字支付系统。' },
        403: { message: 'Forbidden', description: '已禁止。服务器已经理解请求，但是拒绝执行它。' },
        404: { message: 'Not Found', description: '未找到。服务器无法根据客户端的请求找到资源。' },
        405: { message: 'Method Not Allowed', description: '方法禁用。禁用请求中指定的方法。' },
        406: { message: 'Not Acceptable', description: '不接受。无法使用请求的内容特性响应请求的网页。' },
        407: { message: 'Proxy Authentication Required', description: '需要代理授权。此状态码与 401 类似，但指定请求者应当授权使用代理。' },
        408: { message: 'Request Timeout', description: '请求超时。服务器等候请求时发生超时。' },
        409: { message: 'Conflict', description: '冲突。服务器在完成请求时发生冲突。' },
        410: { message: 'Gone', description: '已删除。如果请求的资源已永久删除，服务器就会返回此响应。' },
        411: { message: 'Length Required', description: '需要有效长度。服务器不接受不含有效内容长度标头字段的请求。' },
        412: { message: 'Precondition Failed', description: '未满足前提条件。服务器未满足请求者在请求中设置的其中一个前提条件。' },
        413: { message: 'Payload Too Large', description: '请求实体过大。服务器无法处理请求，因为请求实体过大，超出服务器的处理能力。' },
        414: { message: 'URI Too Long', description: '请求的URI过长。请求的URI（通常为网址）过长，服务器无法处理。' },
        415: { message: 'Unsupported Media Type', description: '不支持的媒体类型。请求的格式不受请求页面的支持。' },
        416: { message: 'Range Not Satisfiable', description: '请求范围不符合要求。如果页面无法提供请求的范围，则服务器会返回此状态码。' },
        417: { message: 'Expectation Failed', description: '未满足期望值。服务器未满足"期望"请求标头字段的要求。' },
        418: { message: "I'm a teapot", description: '我是一个茶壶。这是一个愚人节玩笑，在RFC 2324中定义的。' },
        421: { message: 'Misdirected Request', description: '错误指向的请求。该请求针对的是无法产生响应的服务器。' },
        422: { message: 'Unprocessable Entity', description: '无法处理的实体。请求格式正确，但是由于含有语义错误，无法响应。' },
        423: { message: 'Locked', description: '已锁定。当前资源被锁定。' },
        424: { message: 'Failed Dependency', description: '失败的依赖关系。由于之前的某个请求发生的错误，导致当前请求失败。' },
        425: { message: 'Too Early', description: '太早。服务器不愿意冒风险处理可能被重放的请求。' },
        426: { message: 'Upgrade Required', description: '需要升级。客户端应当切换到TLS/1.0，并在HTTP/1.1 Upgrade header中给出。' },
        428: { message: 'Precondition Required', description: '要求先决条件。原始服务器要求该请求满足一定条件。' },
        429: { message: 'Too Many Requests', description: '请求过多。用户在给定的时间内发送了太多的请求。' },
        431: { message: 'Request Header Fields Too Large', description: '请求头字段太大。服务器不愿意处理请求，因为一个或多个头字段过大。' },
        451: { message: 'Unavailable For Legal Reasons', description: '因法律原因不可用。该访问因法律的要求而被拒绝。' },

        // 5xx 服务器错误
        500: { message: 'Internal Server Error', description: '内部服务器错误。服务器遇到错误，无法完成请求。' },
        501: { message: 'Not Implemented', description: '尚未实施。服务器不具备完成请求的功能。' },
        502: { message: 'Bad Gateway', description: '错误网关。服务器作为网关或代理，从上游服务器收到无效响应。' },
        503: { message: 'Service Unavailable', description: '服务不可用。服务器目前无法使用（由于超载或停机维护）。' },
        504: { message: 'Gateway Timeout', description: '网关超时。服务器作为网关或代理，但是没有及时从上游服务器收到请求。' },
        505: { message: 'HTTP Version Not Supported', description: '不支持HTTP版本。服务器不支持请求中所用的HTTP协议版本。' },
        506: { message: 'Variant Also Negotiates', description: '服务器存在内部配置错误。' },
        507: { message: 'Insufficient Storage', description: '存储空间不足。服务器无法存储完成请求所必须的内容。' },
        508: { message: 'Loop Detected', description: '检测到循环。服务器在处理请求时陷入死循环。' },
        510: { message: 'Not Extended', description: '获取资源所需要的策略并没有被满足。' },
        511: { message: 'Network Authentication Required', description: '需要网络身份验证。客户端需要进行身份验证才能获得网络访问权限。' }
    };

    static getStatusInfo(code) {
        try {
            const statusCode = parseInt(code);
            if (!this.statusCodes[statusCode]) {
                return { success: false, error: '未知的HTTP状态码' };
            }

            const info = this.statusCodes[statusCode];
            return {
                success: true,
                data: {
                    code: statusCode,
                    message: info.message,
                    description: info.description,
                    category: this.getCategory(statusCode)
                }
            };
        } catch (error) {
            return { success: false, error: '无效的状态码格式' };
        }
    }

    static getCategory(code) {
        if (code >= 100 && code < 200) return '信息响应';
        if (code >= 200 && code < 300) return '成功响应';
        if (code >= 300 && code < 400) return '重定向';
        if (code >= 400 && code < 500) return '客户端错误';
        if (code >= 500 && code < 600) return '服务器错误';
        return '未知';
    }

    static searchStatus(query) {
        try {
            const searchTerm = query.toLowerCase();
            const results = [];

            for (const [code, info] of Object.entries(this.statusCodes)) {
                if (code.includes(searchTerm) ||
                    info.message.toLowerCase().includes(searchTerm) ||
                    info.description.toLowerCase().includes(searchTerm)) {
                    results.push({
                        code: parseInt(code),
                        message: info.message,
                        description: info.description,
                        category: this.getCategory(parseInt(code))
                    });
                }
            }

            return { success: true, data: results };
        } catch (error) {
            return { success: false, error: '搜索过程中发生错误' };
        }
    }

    static getAllStatusCodes() {
        try {
            const categories = {
                '信息响应 (1xx)': [],
                '成功响应 (2xx)': [],
                '重定向 (3xx)': [],
                '客户端错误 (4xx)': [],
                '服务器错误 (5xx)': []
            };

            for (const [code, info] of Object.entries(this.statusCodes)) {
                const numCode = parseInt(code);
                const item = {
                    code: numCode,
                    message: info.message,
                    description: info.description
                };

                if (numCode >= 100 && numCode < 200) {
                    categories['信息响应 (1xx)'].push(item);
                } else if (numCode >= 200 && numCode < 300) {
                    categories['成功响应 (2xx)'].push(item);
                } else if (numCode >= 300 && numCode < 400) {
                    categories['重定向 (3xx)'].push(item);
                } else if (numCode >= 400 && numCode < 500) {
                    categories['客户端错误 (4xx)'].push(item);
                } else if (numCode >= 500 && numCode < 600) {
                    categories['服务器错误 (5xx)'].push(item);
                }
            }

            return { success: true, data: categories };
        } catch (error) {
            return { success: false, error: '获取状态码列表时发生错误' };
        }
    }
}